package _11_整理题目._6_模拟设计._计算器;


import org.junit.Test;

import java.util.HashSet;
import java.util.Set;
import java.util.Stack;

/**
 * https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
 *
 * 逆波兰式（Reverse Polish notation，RPN，或逆波兰记法），
 * 也叫后缀表达式（将运算符写在操作数之后）
 * 根据 逆波兰表示法，求表达式的值。
 *
 */
public class _04_逆波兰表达式求值 {

    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        int n = tokens.length;

        for(int i=0; i<n; i++) {
            // 可以使用 正则表达式 tokens[i].matches("[+|\\-|*|/]") ，会耗费更多的时间
            if(tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
                int a = stack.pop();
                int b = stack.pop();
                if(tokens[i].equals("+")) {
                    stack.push(b + a);
                } else if(tokens[i].equals("-")) {
                    stack.push(b - a);
                } else if(tokens[i].equals("*")) {
                    stack.push(b * a);
                } else if(tokens[i].equals("/")) {
                    stack.push(b / a);
                }
            } else {
                stack.push(Integer.valueOf(tokens[i]));
            }
        }
        return stack.pop();
    }

    @Test
    public void main() {
        String[] strings = {"4","13","5","/","+"};
        System.out.println(evalRPN(strings)); // 6
    }
}
